/**
 * Generali Solutions d'assurances - Tous droits rï¿½servï¿½s &copy; 2007 - 2010
 */
package fr.generali.accueilclient.referentiel.assembler;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.core.convert.converter.Converter;

import fr.generali.accueilclient.produit.param.ITableProduit;
import fr.generali.accueilclient.produit.param.builder.TableProduitBuilder;
import fr.generali.accueilclient.referentiel.ReferentielEnum;
import fr.generali.accueilclient.table.param.ITableParam;
import fr.generali.accueilclient.table.param.builder.TableParamBuilder;
import fr.generali.accueilclient.utils.tuple.Couple;
import fr.generali.refservcommuns.rce.referentiel.produits.list.produit.DTOProduit;

/**
 * @author ebrouillard
 */

public class ListProduits2MapTableProduitConverter implements
                Converter<List<DTOProduit>, Couple<ReferentielEnum, Map<ITableParam, ITableProduit>>> {

    /**
     * {@inheritDoc}
     */
    public Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> convert(List<DTOProduit> input) {
        Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> couple = null;

        couple = buildCouple(ReferentielEnum.LIBELLE_PRODUIT, input);

        return couple;
    }

    /**
     * Construit le couple (referentiel, liste de valeurs) quand on prend toutes
     * les valeurs renvoyes par le service
     * 
     * @param referentiel le referentiel
     * @param input un {@link DTOProduit} fourni par le service
     * @return le couple (referentiel, liste de valeurs)
     */
    private Couple<ReferentielEnum, Map<ITableParam, ITableProduit>> buildCouple(ReferentielEnum referentiel,
                    List<DTOProduit> input) {
        Map<ITableParam, ITableProduit> liste = buildListe(input);
        return new Couple<ReferentielEnum, Map<ITableParam, ITableProduit>>(referentiel, liste);
    }

    /**
     * Construit la liste des rï¿½fï¿½rences quand on les prend toutes
     * 
     * @param input un {@link DTOProduit} fourni par le service
     * @return la liste des references
     */
    private Map<ITableParam, ITableProduit> buildListe(List<DTOProduit> input) {
        List<DTOProduit> produitsListe = input;
        Map<ITableParam, ITableProduit> liste = new HashMap<ITableParam, ITableProduit>(produitsListe.size());
        for (int i = 0; i < produitsListe.size(); i++) {
            DTOProduit produit = produitsListe.get(i);

            ITableProduit tableProduit = TableProduitBuilder.tableProduit()
                            .buildCode(produit.getCode())
                            .buildCodeCompagnie(produit.getCodeCompagnie())
                            .buildCodeSystemeOrigine(produit.getCodeSystemeOrigine())
                            .buildNomCommercial(produit.getNomCommercial())
                            .build();

            ITableParam tableParam = TableParamBuilder.tableParam()
                            .buildCode(produit.getCode())
                            .buildSystemOrigine(produit.getCodeSystemeOrigine())
                            .build();

            liste.put(tableParam, tableProduit);
        }
        return liste;
    }

}
